﻿using System;
using System.Collections.Generic;
using System.IO;
using System.ServiceProcess;
using WeWork.Service.Framework.Cache;
using WeWork.Entitys;
using WeWork.SDK;

namespace WeWork.Service.Framework
{
    public partial class Service1 : ServiceBase
    {
        public Service1()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            //此处list可以从自己的数据库中取出
            List<CorpInfo> list = new List<CorpInfo>();
            foreach (var info in list)
            {
                TimerHelper.SetTimeOut(info.CorpId, () =>
                {
                    //将正在执行的企业微信加入缓存列表
                    ConcurrentCache<string, bool> concurrentCache = new ConcurrentCache<string, bool>();
                    //判断是否正在执行 如果正在执行中 则等到执行完毕后在下次执行
                    if (!concurrentCache.TryGet(info.CorpId))
                    {
                        //开始执行时，保存到缓存中
                        concurrentCache.TryAdd(info.CorpId, true);
                        using (var client = new ChatDataService(info.CorpId, info.ChatAgentId, info.ChatSecret, info.VerKeys))
                        {
                            //这个可以第一次使用为0 下一次使用为上一次拉取时保存的最大值
                            //var seq = GetMaxSeq(corpId);
                            //这里可以根据CorpId获取自己数据库中最大的seq，如何没有赋值为0即可
                            var seq = 0;
                            var result = client.GetChatData(seq);
                            //企业微信 会话内容 列表
                            List<ChatMsg> msgList = result.Item1;
                            if (msgList.Count > 0)
                            {
                                //将企业微信会话内容列表保存到数据库中
                            }
                            msgList = null;

                            //媒体资源文件下载
                            var fileList = result.Item2;
                            /*
                            这里需要注意两点
                            1.要根据Md5Sum值进行去重，已经把资源文件保存成功的就不用下载保存了
                            2.可能由于网络等原因导致资源文件未下载保存成功，需要再次下载
                            */
                            //这里就假设 资源文件都未下载保存过 
                            if (fileList.Count > 0)
                            {
                                var files = client.GetFileList(fileList);
                                foreach (var item in files)
                                {
                                    bool isDownload = false;
                                    if (item.FileBytes.Length > 0)
                                    {
                                        string fileName = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory) + Path.DirectorySeparatorChar + "Download" + Path.DirectorySeparatorChar + item.SavePath;
                                        if (!File.Exists(fileName))
                                        {
                                            using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write))
                                            {
                                                fs.Write(item.FileBytes, 0, item.FileBytes.Length);

                                                //这里代码 将文件保存下来 
                                                //如果保存成功 将isDownload赋值为true
                                                isDownload = true;
                                            }
                                        }
                                        else
                                        {
                                            //已经存在说明已经下载了
                                            isDownload = true;
                                        }
                                    }
                                    item.IsDownload = isDownload;
                                }
                                //媒体资源文件保存到数据库中
                                /*
                                媒体文件具体怎么保存取决你自己的决定 
                                */


                                fileList = null;
                            }

                            //如果下执行完毕 则删除缓存的列表
                            concurrentCache.TryRemove(info.CorpId, out var value);
                        }
                    }
                }, 180000);
            }
        }

        protected override void OnStop()
        {
        }

        /// <summary>
        /// 测试用
        /// </summary>
        public void OnStart()
        {
            string corpId = "";//企业微信ID
            string agentId = "hhnrcd";//会话内容存档 AgentId
            string secret = "";//会话内容存档 secret
            string privateKey1 = @"-----BEGIN PRIVATE KEY----- -----BEGIN PRIVATE KEY-----";//会话内容存档 加密 私钥及对应版本号 pem格式的私钥

            List<CorpChatEncryptKeys> verKeys = new List<CorpChatEncryptKeys>();
            CorpChatEncryptKeys verKey1 = new CorpChatEncryptKeys()
            {
                Ver = 1,
                PublicKey = "",
                PrivateKey = privateKey1
            };
            verKeys.Add(verKey1);

            using (var client = new ChatDataService(corpId, agentId, secret, verKeys))
            {
                //这个可以第一次使用为0 下一次使用为上一次拉取时保存的最大值
                //var seq = GetMaxSeq(corpId);
                //这里可以根据CorpId获取自己数据库中最大的seq，如何没有赋值为0即可
                var seq = 0; 
                var result = client.GetChatData(seq);
                List<ChatMsg> msgList = result.Item1; //企业微信 会话内容 列表
                //将企业微信会话内容列表保存到数据库中


                //媒体资源文件下载
                var fileList = result.Item2;
                /*
                这里需要注意两点
                1.要根据Md5Sum值进行去重，已经把资源文件保存成功的就不用下载保存了
                2.可能由于网络等原因导致资源文件未下载保存成功，需要再次下载
                */
                //这里就假设 资源文件都未下载保存过 
                if (fileList.Count > 0)
                {
                    var list = client.GetFileList(fileList);
                    foreach (var item in list)
                    {
                        bool isDownload = false;
                        if (item.FileBytes.Length > 0)
                        {
                            string fileName = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory) + Path.DirectorySeparatorChar + "Download" + Path.DirectorySeparatorChar + item.SavePath;
                            if (!File.Exists(fileName))
                            {
                                using (FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write))
                                {
                                    fs.Write(item.FileBytes, 0, item.FileBytes.Length);

                                    //这里代码 将文件保存下来 
                                    //如果保存成功 将isDownload赋值为true
                                    isDownload = true;
                                }
                            }
                            else
                            {
                                //已经存在说明已经下载了
                                isDownload = true;
                            }
                        }
                        item.IsDownload = isDownload;
                    }
                    //媒体资源文件保存到数据库中
                    /*
                    媒体文件具体怎么保存取决你自己的决定 
                    */

                    fileList = null;
                }
                msgList = null;
            }
        }
    }
}
